#include <iostream>
#include <vector>
#include <signal.h>
#include <unistd.h>
using namespace std;
#define MAX_SIGNUM 31 //常规信号数量
static vector<int> sigarr = {2,3}; // 要处理的信号列表

//打印挂起信号集的状态
//从高信号号到低信号号(31到1)遍历
//如果信号在挂起 打印"1" 否则打印"0"
static void show_pending(const sigset_t &pending)
{
    for(int signo = MAX_SIGNUM; signo >= 1; signo--)
    {
        if(sigismember(&pending, signo))
            cout << "1";
        else 
            cout << "0";
    }
    cout <<endl;
}

//当信号被递送时打印信息
static void myhandler(int signo)
{
    cout << signo << " 号信号已经被递达!!!\n";
}

int main()
{
    //为sigarr中的信号设置自定义处理函数
    for(auto&sig : sigarr)
    signal(sig,myhandler);

    // 初始化信号集
    sigset_t block, oblock, pending;
    sigemptyset(&block); //新屏蔽集合
    sigemptyset(&oblock); //旧屏蔽集合
    sigemptyset(&pending); //挂起集合

    // 将sigarr中的信号 添加到block屏蔽集合内
    for(auto &sig : sigarr) sigaddset(&block, sig);

    // 将block中的信号设置信号屏蔽
    sigprocmask(SIG_SETMASK, &block, &oblock);

    int cnt = 5;
    while(true)
    {
        sigemptyset(&pending); //此处初始化不是绝对必需的 sigpending()会完全覆盖内容
        sigpending(&pending);  // 获取挂起信号集
        show_pending(pending); // 显示挂起信号状态
        sleep(1);
    
        if(cnt-- == 0)
        {
            // 5秒后解除信号屏蔽
            sigprocmask(SIG_SETMASK, &oblock, &block);
            cout << "恢复对信号的屏蔽,不屏蔽任何信号"<<endl;
        }
    }



    return 0;
}